#ifndef CAMPRO_H
#define CAMPRO_H

#define __CAM_HIGHCAM_DRIVER_PUBLIC__


/*******************03版接口规范*************************/
//设备状态
#define FR_DS_ONLINE           0 //设备在线
#define FR_DS_OFFLINE          1 //设备掉线
#define FR_DS_BUSY             2 //设备忙
#define FR_DS_HARDWAREERROR    3 //设备硬件故障
#define FR_DS_UNKNOW           4 //未知错误

// 错误码
#define		FR_RET_SUCC	0		// 成功
#define		FR_RET_FAIL	-1		// 失败
#define		FR_RET_PARA	-2		// 参数错误
#define		FR_RET_NDEV	-3		// 打开设备失败
#define		FR_RET_NINI	-4		// 未打开设备
#define		FR_RET_BUSY	-5		// 设备繁忙
#define		FR_RET_DATA	-6		// 图像数据不正确
#define		FR_RET_NLNK	-7		// 设备断开
#define		FR_RET_NDRV	-8		// 加载设备库失败
#define		FR_RET_NALG	-9		// 加载算法库失败
#define		FR_RET_NMEM	-10		// 内存分配失败
#define		FR_RET_ARDY	-11		// 已经打开设备
#define		FR_RET_AUTH	-12		// 算法授权失败
#define		FP_RET_IPCF	-13		// IPC错误
#define		FR_RET_NSUP -14		// 设备不支持该功能

/**************************操作接口****************************/

/**
 * @brief 初始化SDK资源，驱动内部完成所有配置读取、运行环境准备
 * 调用其他接口前，应该先调用本函数
 * @param[in] 无
 * @param[out] 无
 * @return 成功返回0，失败返回其他
**/
extern "C"  int  HIGH_InitSDK();

/**
 *@brief 释放资源，卸载SDK
 *@param[in] 无
 *@param[out] 无
 *@return 无
**/
extern "C" void HIGH_ReleaseSDK();

/**
 *@brief 打开高拍仪，在HIGH_InitSDK后调用
 *@param[in] 无
 *@param[out] 无
 *@return 成功返回0，失败返回其他
**/
extern "C" int  HIGH_StartCamera();
extern "C" int  HIGH_StartCameraEx(int camindex);  //camindex: 0->摄像头1, 1->摄像头2

/**
 * @brief 获得固件版本，在HIGH_StartCamera后调用
 * @param[out] szVersion 固件版本，格式：厂商+高拍仪型号+PIDVID（彩色高拍仪）+固件版本号/固件修改日期
 * @return 成功返回0，失败返回其他
 **/
extern "C" int  HIGH_GetFirmwareVersion(char szVersion[64]);

/**
 *@brief 获取设备状态
 *@param[in][out]piStatus设备状态：参考设备状态宏定义
 *@return 无
 **/
extern "C" void  HIGH_GetStatus(int* piStatus);

/**
 * @brief 关闭高拍仪
 * @param[in] 无
 * @param[out] 无
 * @return 成功返回0，失败返回其他
 **/
extern "C" int  HIGH_StopCamera();

/**
 *@brief 获取高拍仪支持的像素个数
 *@param[in] 无
 *@param[out] 无
 *@return 成功返回像素个数，失败返回其他
**/
extern "C" int  HIGH_GetPixelNum();
extern "C" int  HIGH_GetPixelNumEx(int camindex);  //camindex: 0->摄像头1, 1->摄像头2

/**
 *@brief 根据索引获取高拍仪像素宽度
 *@param[in] nIndex 像素索引
 *@param[out] 无
 *@return 成功返回像素索引对应的宽度，失败返回其他
**/
extern "C" int  HIGH_GetHPixelByIndex(int nIndex);

/**
 *@brief 根据索引获取高拍仪像素高度
 *@param[in] nIndex 像素索引
 *@param[out] 无
 *@return 成功返回像素索引对应的高度，失败返回其他
**/
extern "C" int  HIGH_GetVPixelByIndex(int nIndex);

/**
 *@brief 设置高拍仪分辨率
 * @param[in] nHPixel 水平分辨率
 * @param[in] nVPixel 垂直分辨率
 *@param[out] 无
 *@return 成功返回0，失败返回其他
**/
extern "C" int  HIGH_SetCameraPixel(int nHPixel, int nVPixel);
extern "C" int  HIGH_SetCameraPixelEx(int camindex,int nHPixel, int nVPixel); //camindex: 0->摄像头1, 1->摄像头2

/**
 *@brief 设置高拍仪旋转角度
 * @param[in] nRotateSize
 * 旋转角度，0:不旋转 1:90度 2:180度 3:270度
 *@param[out] 无
 *@return 成功返回0，失败返回其他
**/
extern "C" int  HIGH_SetRotateSize(int nRotateSize);

/**
 *@brief 设置高拍仪色彩类型
 * @param[in] nColorType
 * 色彩类型，0:彩色(24bpp) 1:灰度（黑白） 2:黑白（素描）
 *@param[out] 无
 *@return 成功返回0，失败返回其他
**/
extern "C" int  HIGH_SetColorType(int nColorType);
/**
 * @brief 设置拍照自动捕捉（裁剪）
 * 设置为自动捕捉时 预览时需要实时画出红框框住目标 拍照HIGH_TakePicture时图片为自动获取目标后裁剪的图片
 * @param[in] bAuto
 * 是否自动纠编 0 - 不捕捉，不提示；1 - 自动捕捉，提示框随目标自动移动
 * @param[out] 无
 * @return 成功返回0，失败返回其他
 **/
extern "C" int  HIGH_SetAutoCrop(int bAuto);

/**
* @brief 创建窗口并开始预览。调用此函数表示需要驱动库实现窗口显示
*        该接口为非阻塞接口，上层可随时调用COM_CloseWindow函数来关闭窗口。
* @param[in] ulWndHandle 窗口句柄，为0时需要厂商库内部创建窗口。不为0时需要厂商库将画面显示到指定窗口上。
* @param[in] iX 窗口左上角X坐标，ulWndHandle为空表示X坐标相对于屏幕,否则X坐标相对于预览窗口；
* @param[in] iY 窗口左上角Y坐标，ulWndHandle为空表示Y坐标相对于屏幕,否则Y坐标相对于预览窗口；
* @param[in] iWidth 窗口宽度；
* @param[in] iHeight 窗口高度；
* @return 成功返回0，失败返回其他
**/
extern "C" int  HIGH_CreateWindowEx(unsigned long ulWndHandle, int iX, int iY, int iWidth, int iHeight);

/**
* @brief 设置预览缩放视图
* @param[in] iView 缩放值 0-正常视图 -1~-5依次缩小，-5最小。1~5依次放大，5最大。默认为0
* @param[out] 无
* @return 成功返回0，失败返回其他
**/
extern "C" int  HIGH_SetZoomView(int iView);

/**
 * @brief 创建预览窗口，并开始预览。调用此函数表示需要驱动库实现窗口显示
 *        该接口为非阻塞接口，上层可随时调用HIGH_CloseWindow函数来关闭窗口。
 * @param[in] iX
 * 窗口左上角X坐标，ulWndHandle为空表示X坐标相对于屏幕,否则X坐标相对于预览窗口；
 * @param[in] iY
 * 窗口左上角Y坐标，ulWndHandle为空表示Y坐标相对于屏幕,否则Y坐标相对于预览窗口；
 * @param[in] iWidth
 * 窗口宽度；
 * @param[in] iHeight
 * 窗口高度；
 * @return 参考函数返回结果宏定义
**/
extern "C" int  HIGH_CreateWindow(int iX, int iY, int iWidth, int iHeight);

/**
 * @brief 关闭预览窗口。
 * @return 参考函数返回结果宏定义
**/
extern "C" int  HIGH_CloseWindow();

/**
 * @brief 预览暂停/恢复
 * @param[in] isPause true 暂停，false 恢复
 * @param[out] 无
 * @return 成功返回0，失败返回其他
 **/
extern "C" int  HIGH_PauseAndPlay(bool isPause);


/**
 *@brief 设置高拍仪图片质量
 * @param[in] nJPGQuality
 * 图片质量
 *@param[out] 无
 *@return 成功返回0，失败返回其他
**/
extern "C" int  HIGH_SetJPGQuality(int nJPGQuality);
/**
 * @brief 拍照，如果在HIGH_PauseAndPlay之后调用，拍的是暂停时的那一帧照片
 * @param[in] strFilePath 图片路径
 * @param[out] 无
 * @return 成功返回0，失败返回其他
 **/
extern "C" int  HIGH_TakePicture(const char* strFilePath);

/**
* @brief 设置图像DPI
* @param[in] iDPI 图像DPI
* @param[out] 无
* @return 成功返回0，失败返回其他
**/
extern "C" int  HIGH_SetPicDPI(int iDPI);


 /**
    * @brief  图像合并
    * @param[in] srcFilePath1  图片绝对路径
    * @param[in] srcFilePath2  图片绝对路径
    * @param[in] desFilePath   合并后的图片绝对路径
    * @param[in] dir 合并方向   0-垂直，1-水平
    **/
  extern "C" int HIGH_CombineImages(char* srcFilePath1,char* srcFilePath2,char* desFilePath,int dir);

#endif // CAMPRO_H


